Skip to content

HJ74 参数解析 ​

本节目标:理解“HJ74 参数解析”的核心思路,并能把它用于实际开发或面试表达。 中等 通过率:29.16% 时间限制:1秒 空间限制:32M 知识点==字符串====模拟== 描述 在命令行输入如下命令: xcopy /s c:\ d:\e, 各个参数如下: 参数1:命令字xcopy 参数2:字符串/s 参数3:字符串c:\ 参数4: 字符串d:\e 请编写一个参数解析程序,实现将命令行各个参数解析出来。

解析规则: 1.参数分隔符为空格 2.对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s "C:\program files" "d:"时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将""去掉,引号不存在嵌套情况。 3.参数不定长 4.输入由用例保证,不会出现不符合要求的输入 数据范围:字符串长度:1≤�≤1000 1≤s≤1000 进阶:时间复杂度:�(�) O(n) ,空间复杂度:�(�) O(n) 输入描述: 输入一行字符串,可以有空格 输出描述: 输出参数个数,分解后的参数,每个参数都独占一行 示例1 输入: xcopy /s c:\ d:\e ==复制== 输出: 4xcopy/sc:\d:\e

思路:

  • 当碰到引号时,进入一种新模式,然后其它判断以这个模式开关进行判断;
  • 当在这个模式中碰到另外一个引号,处理数据,结束这个模式

input_str = input().strip() # 去除输入字符串首尾的空格 args = [] # 初始化参数列表 current_arg = "" # 当前正在处理的参数 in_quotes = False # 是否在双引号内 for c in input_str: if c == '"': # 遇到双引号 in_quotes = not in_quotes # 切换双引号内外状态 continue # 不将双引号添加到参数中 if c.isspace() and not in_quotes: # 遇到空格,并且不在双引号内 if current_arg: # 如果当前参数非空,说明一个参数已经结束 args.append(current_arg) # 将这个参数加入到参数列表 current_arg = "" # 重置当前参数为空字符串,准备接收下一个参数 else: current_arg += c # 将字符添加到当前参数的末尾 if current_arg: # 最后一个参数后面可能没有空格,需要额外处理 args.append(current_arg) # 将最后一个参数添加到参数列表

输出参数个数和每个参数 ​

print(len(args)) for arg in args: print(arg)

状态机解法 这次我们将使用一个状态机的思路,通过切换状态来识别参数: def parse_command(command): args = [] # 用于存储解析出来的参数 current_arg = [] # 用于构建当前参数 in_quotes = False # 标记是否处于引号内 for c in command: if c == '"': # 遇到引号,切换引号内外状态 in_quotes = not in_quotes elif c == ' ' and not in_quotes: # 遇到空格,且不在引号内 if current_arg: # 如果当前参数已经开始收集 args.append(''.join(current_arg)) # 完成一个参数的收集,加入到参数列表 current_arg = [] # 重置当前参数为空列表,为收集新参数准备 else: current_arg.append(c) # 将字符加入当前参数 if current_arg: # 检查是否有未完成的参数 args.append(''.join(current_arg)) # 将最后的参数加入到参数列表 return args

读取命令行输入 ​

command_line = input().strip()

解析命令行 ​

parsed_args = parse_command(command_line)

打印解析结果 ​

print(len(parsed_args)) for arg in parsed_args: print(arg) 这个函数parse_command将命令行字符串作为输入,并返回参数列表。我们用一个列表current_arg来构建当前参数,这样可以避免在每次循环时创建新字符串,提高效率。当遇到引号时,我们切换in_quotes状态。当遇到空格且不在引号内时,我们将current_arg添加到参数列表中。如果遇到字符,我们则将其添加到current_arg。最后,如果在输入结束时current_arg非空,我们也将其添加到参数列表中。这样就可以保证正确解析出所有参数。 这种方法的好处是它在遍历输入字符串时立即构建参数,而无需回头检查或重新分配字符串,从而在大多数情况下提高了效率。

本站总访问 — 次